Application-Event stört gewaltig…

Ich bekam die Aufgabe, die Transaktion CO41 – Umsetzung Planaufträge um ein paar Funktionen zu erweitern. Nach einigem Hin- und Herüberlegen entschied ich mich dafür, an geeigneter Stelle (Include LCOUPF1N – Routine INIT_FBILD) mittels impliziter Erweiterung einen Docking-Container mit einem Dynamischen Dokument anzubinden. Der Docking Container war schnell erstellt und auch die ersten Zeichen inklusive Drucktaste waren zügig gezaubert.

Leider funktioniert dieser erste Wurf nicht, denn nach Drücken des Druckknopfes wurde nicht meine registrierte Methode angesprungen, sondern es kam die Meldung “Die angeforderte Funktion %_GC 1 ist hier nicht vorgesehen”.

Ich brauchte lange, um herauszufinden, dass die in einigen von der SAP verwendete FBS – Folgebildsteuerung der Grund für die Meldung war (Funktionsbaustein SCREEN_SEQUENCE_CONTROL). Beziehungsweise war das nicht in erster Linie der Grund, sondern der Umstand, dass bei den Dynamischen Dokumenten die zugehörigen Events alle standardmäßig als “application events” registriert werden. Das hat zur Folge, dass die Ereignissteuerung nicht nur innerhalb der Klasse durchgeführt wird, sondern einen “Umweg” über das Dynpro macht. Es wird in dem Fall ein Funktionscode ausgelöst, bei dem das PAI – Process After Input durchlaufen wird.

Meistens ist das egal, denn es werden vom Programm in der Regel nur die Funktionscodes abgeprüft, die auch definiert wurden. Man kann also in einer Transaktion “JIFDIJIFG” eingeben und es passiert nichts. In der CO41 kann man das jedoch nicht, da für jeden Funktionscode in einer Tabelle nachgeprüft wird, wie bei diesem Funktionscode verfahren werden soll. Findet der Funktionsbaustein SCREEN_SEQUENCE_CONTROL keinen Eintrag, dann kommt die oben genannte Meldung.

Lösung

Ich machte mich schon darauf gefasst, die Klasse CL_DD_DOCUMENT abzuleiten, um die Methode DISPLAY, in der die Ereignisregistrierung stattfindet, zu redefinieren. Glücklicherweise ist das HTML-Objekt, in dem das Dynamische Dokument angezeigt wird und für das die Ereignisse registriert werden, öffentlich. Dadurch konnte ich das Ereignis SAPEVENT erneut, aber diesmal ohne APPL_EVENT, registrieren:

document->merge_document( ).
document->display_document( parent = docker ).
DATA(html) = document->html_control.

DATA: myevent_tab TYPE cntl_simple_events,
myevent TYPE cntl_simple_event.
myevent-eventid = html->m_id_sapevent.
myevent-appl_event = ' '.
APPEND myevent TO myevent_tab.
html->set_registered_events( events = myevent_tab ).

Nun konnte ich endlich meine Tasten drücken, ohne dass mir die Folgebildsteuerung in die Quere kam.

Enno Wulff